/*单调性分析：
* 任意比答案小的间距的选择方案(选的过多)，其元素总和必然超过m
* 任意比答案大或相等的间距(1.存在更优解 2.本身就是最优解)，必然存在一个方案，使得元素总和小于等于m
* 问题转化为，在确定最小间距的情况下，找到元素总和小于等于m的情况
*/
#include <iostream>
#include <cstring>

using namespace std;
// #define ONLINE_JUDGE
#define int long long
const int N = 1e9 + 10;
#define get(i) (f[i-1] - s[i]) // i之前的m个区间内，符合规则的最大值
int n, m;
int s[N];
int f[N], q[N];

signed main() 
{

    #ifdef ONLINE_JUDGE

    #else
    freopen("./in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(false);
	cin.tie(0);

    cin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        cin >> s[i];
        s[i] += s[i-1];
    } 

    int hh = 0, tt = 0;

    for(int i = 1; i <= n; i++) 
    {
        if(q[hh] < i - m) hh++; 
        f[i] = max(f[i-1], get(q[hh]) + s[i]);
        while(hh <= tt && get(q[tt]) <= get(i)) tt--;
        q[++tt] = i;
    }

    cout << f[n] << endl;

    return 0;
}

